import { isArray } from '@ember/array';
import { inject as service } from '@ember/service';
import Component from '@ember/component';
import layout from './template';
import { computed, observer } from '@ember/object';

export default Component.extend({
  allContainers: service(),

  layout,
  selected:          null,  // Selected service ID
  exclude:           null,  // ID or array of IDs to exclude from list
  stack:             null,  // The current stack, to generate stack-relative names

  // For use as a catalog question
  field:   null,              // Read default from a schema resourceField
  value:   null,
  // stackName/serviceName string output

  init() {
    this._super(...arguments);

    let def = this.get('field.default');

    if ( def && !this.get('selected') ) {
      let match = this.get('allContainers.list').findBy('name', def);

      this.set('selected', match || null);
    }
  },

  selectedChanged: observer('selected', function() {
    let id = this.get('selected');
    let str = null;

    if ( id ) {
      let container = this.get('allContainers').byId(id);

      if ( container ) {
        if ( this.get('stack') && this.get('stack') === container.get('stack') ) {
          str = container.get('name');
        } else {
          str = `${ container.get('stack.name')  }/${  container.get('name') }`;
        }
      }
    }

    this.set('value', str);
  }),
  grouped: computed('allContainers.list.[]', 'canBalanceTo', 'canHaveContainers', 'exclude', function() {
    let list = this.get('allContainers.list');

    let exclude = this.get('exclude');

    if ( exclude ) {
      if ( !isArray(exclude) ) {
        exclude = [exclude];
      }

      list = list.filter((x) => !exclude.includes(x.id));
    }

    return this.get('allContainers').group(list);
  }),

});
